package demo4;

/**
 * Created by Administrator on 2017/4/5.
 */
//: c04:Garbage.java
// Demonstration of the garbage
// collector and finalization

class Chair {
    static boolean gcrun = false;
    static boolean f = false;
    static int created = 0;
    static int finalized = 0;
    int i;
    Chair() {
        i = ++created;
        if(created == 47)
            System.out.println("Created 47");
    }
    public void finalize() {
        if(!gcrun) {
            // The first time finalize() is called:
            gcrun = true;
            System.out.println(
                    "Beginning to finalize after " +
                            created + " Chairs have been created");
        }
        if(i == 47) {
            System.out.println(
                    "Finalizing Chair #47, " +
                            "Setting flag to stop Chair creation");
            f = true;
        }
        finalized++;
        if(finalized >= created)
            System.out.println(
                    "All " + finalized + " finalized");
    }
}

public class Garbage {
    public static void main(String[] args) {
        // As long as the flag hasn't been set,
        // make Chairs and Strings:
        while(!Chair.f) {
            new Chair();
            new String("To take up space");
        }
        System.out.println(
                "After all Chairs have been created:\n" +
                        "total created = " + Chair.created +
                        ", total finalized = " + Chair.finalized);
        // Optional arguments force garbage
        // collection & finalization:
        if(args.length > 0) {
            if(args[0].equals("gc") ||
                    args[0].equals("all")) {
                System.out.println("gc():");
                System.gc();
            }
            if(args[0].equals("finalize") ||
                    args[0].equals("all")) {
                System.out.println("runFinalization():");
                System.runFinalization();
            }
        }
        System.out.println("bye!");
    }
} ///:~